Vue Fes Japan 2018
https://gyazo.com/6f72bb258fc1196e77ab9426c642c816
https://vuefes.jp/
2018/11/3 10:20〜20:00
N35.7004201,E139.7722717,Z17 秋葉原UDX
Key Talk Evan You
Vue3.0のアップデート内容について
Vueロンドンにて開発内容を発表
Mediumでも発表してる
Plans for the Next Iteration of Vue.js – The Vue Point – Medium
Vue3.0では
より速く
仮想DOM実装をフルスクラッチでルク地直し
mount
patch
2.0と比較して2倍くらいになってる
既存のインターフェイスはそのまま
プロキシを用いた監視で言語レベル&速度向上
データのObserve
監視していて変更されたら通知
プロパティの追加と削除
ネイティブプロキシによるプロパティプロキシの高速化
Good By Object.defineProperty()
実行中のオーバーヘッド削除のためコンパイル時にヒントを追加
JSへのコンパイルも改善
render FunctionはJSXのrender機能と似ている
コンポーネント探索の高速化+単型の呼び出し+小要素の種類を抽出
不要な条件分岐を省略
JSエンジンが最適化しやすくする
コンポーネントはコンポーネントであることを認識させる必要がある
これをコンパイラが行い、速度向上
子要素がない場合も改善される
スロット生成の最適化
インスタンスが依存関係を正しくトラッキング
不要な親/子のレンダリングを回避
Lazy Functiionをつかう
子をレンダリングするとき、親には変化がない
スロットのレンダリングを遅延させることでデータの依存関係がちゃんととれる
Static Tree Hosting
静的ツリーの巻き上げ
Virtual DOMで同じものだった場合はレンダーを省略
ノード自体へのpatch適用は省略するが子要素は実施する
静的要素と属性はキャッシュ
Inline Handler Hosting
インラインハンドラの巻き上げ
異なるインライン関数のための再描画は省略できる
100%高速化&使用メモリ半減
インスタンスの初期化のパフォーマンスが改善
より小さく
Tree-Shaking対応
ビルトインコンポーネント
ディレクティブのヘルパー
ユーティリティ関数
コンパイラが自動的にビルド
gzipで10kb以下
よりメンテナンスしやすく
アーキテクチャの整理
パッケージの分離
monorepoにした
実行環境に依存しない
ユーザからは1つのパッケージとして扱える
テストセットアップの改善
ランタイムテストを動かすのも簡易的に
よりネイティブ向けに
カスタムレンダラーAPIの提供
より保守性を向上
リアクティビティAPI
2.0ではデータをコンポーネント内に入れなければならなかったが
3.0では分離できる
コンポーネントの再描画の理解
Vuexがいらなくなる?
Render Track
TypeScriptのサポート
クラスのコンポーネントとAPIをネイティブに扱える
TSXでrender関数を扱える
propsの型も見れる
propsを忘れたら警告を出す
実験的機能
Hooks APIについて
React.js16より登場
ロジックの梱包が簡易的に
mixinは便利だが
複数で使うとネームスペース問題が発生することがある
Time Slicing
同じくReactでの開発が進められている
同じイベント処理が走ったら1回目以降をスキップし、描画を高速化させることができる
プラチナスポンサーセッション
株式会社プレイド
KARTEが1,000サイト以上でVue.jsを動かしている話
2014年からVue.jsを使い始めた
管理画面上で650 Vueコンポーネント数
コミュニティへの貢献も行ってる
Vue.js入門の著者野田さん
Vue-meetupでEvan氏とオンラインチャット
ランチセッション
LINE株式会社
株式会社SCOUTER
Repro株式会社
Next-level Vue Animations Sarah Drasner
http://slides.com/sdrasner/vuefes-japan
なぜアニメーションが必要なのか
シームレスな動きを行う
新しい概念に対応できるようにはなってない
http://www.webperformancetoday.com/2012/03/21/neuroscience-page-speed-web-performance/
タイミング
ユーザーへの見え方を考慮しよう
SEOへの影響がある
理解しやすく
空間的に表現できるか
https://tympanus.net/Development/SeatPreview/
過剰なトランジションをなくそう
Paul Bakaus
https://gyazo.com/c90e47f8aae9e88d2212d365c4d66f77
スピードの錯覚
モーフィング
https://codepen.io/sdras/full/qOdwdB
https://css-tricks.com/the-importance-of-context-shifting-in-ux-patterns/
どうやって実現していくか
transtionを見直す
v-if="isShow"で表示するだけ
https://codepen.io/sdras/pen/df955fc6a1f482dcf104f2648746f8b3
v-enter, v-leaveなどの要素を使う
https://codepen.io/sdras/pen/6ef951b970faf929d8580199fe8ea6ba
さらなる改善
https://codepen.io/sdras/pen/4daa105fc18da0e223b6be9a200b349d
ウォッチャー・リアクティビティ
カスタムディレクティブ
ページトランジション
vue data vis
in-outとout-inを理解する
out-inが重要
https://codepen.io/sdras/full/mRpoOG
CSSアニメーション
DRY(Don't Repeat Yourself)の原則
https://codepen.io/sdras/pen/pRWxGg
code:dry.scss
@mixin ballb($yaxis: 0) {
transform: translate3d(0, $yaxis, 0);
}
@keyframes bouncein {
1% { @include ballb(-400px); }
20%, 40%, 60%, 80%, 95%, 99%, 100% { @include ballb() }
30% { @include ballb(-80px); }
50% { @include ballb(-40px); }
70% { @include ballb(-30px); }
90% { @include ballb(-15px); }
97% { @include ballb(-10px); }
}
.bouncein {
animation: bouncein 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94) both;
}
.ballmove-enter {
@include ballb(-400px);
}
JSによるアニメーション
バインディングで制御できる
@enter="enter"みたいな感じで
methods内でenter()をつくって制御できる
重くならないためにFLIP
First
Last
Invert(逆転)
Play
https://medium.com/outsystems-experts/flip-your-60-fps-animations-flip-em-good-372281598865
transtion-group
https://vuejs.org/v2/guide/transitions.html
https://snipcart.com/blog/vuejs-transitions-animations
リアクティブな仕組みを活用してみよう
https://gist.github.com/staltz/868e7e9bc2a7b8c1f754
getters/setters
Vue.js、MobX、Ractive.js
ウォッチャーとトランジション
https://codepen.io/sdras/pen/OWZRZL
SVGとの相性がいい
リアクティブプログラミングを導入すると、イベントに対して、ステートの更新が簡単になる。
TweenMaxでは直接の表示オブジェクトの値をトゥイーンさせるのではなく、ダミーオブジェクトで管理するといった手法もある。
ダミーオブジェクトの値を、Vueのwatchで反映させればいい。
https://codepen.io/sdras/pen/YZBGNp
https://github.com/sdras/vue-weather-notifier
ステート駆動アニメーション
Vuexをつかってみる
code:vuex-animation.vue.html
<transition @leave="leaveDialog" :css="false">
<app-dialog v-if="showWeather"></app-dialog>
</transition>
<transition @leave="leaveDroparea" :css="false">
<g v-if="showWeather">
<app-droparea v-if="template == 1"></app-droparea>
<app-windarea v-else-if="template == 2"></app-windarea>
<app-rainbowarea v-else-if="template == 3"></app-rainbowarea>
<app-tornadoarea v-else></app-tornadoarea>
</g>
</transition>
<script>
export const store = new Vuex.Store({
state: {
showWeather: false,
template: 0
},
mutations: {
toggle: state => state.showWeather = !state.showWeather,
updateTemplate: (state) => {
state.showWeather = !state.showWeather;
state.template = (state.template + 1) % 4;
}
}
});
</script>
カスタムディレクティブ
v-tackのようなカスタム要素をつくる
code:custom-01.vue.js
Vue.directive('tack', {
bind(el, binding, vnode) {
el.style.position = 'fixed'
}
});
<p v-tack="70">
code:custom-02.vue.js
Vue.directive('tack', {
bind(el, binding, vnode) {
el.style.position = 'fixed'
el.style.top = binding.value + 'px'
}
});
引数などでより詳細にできる
<p v-tack="{ top: '40', left: '100' }">
code:custom-03.vue.js
Vue.directive('tack', {
bind(el, binding, vnode) {
el.style.position = 'fixed';
el.style.top = binding.value.top + 'px';
el.style.left = binding.value.left + 'px';
}
});
アニメーションにも導入できるのでは?
code:anime.js
new Vue({
el: '#app',
methods: {
handleScroll: function(evt, el) {
if (window.scrollY > 50) {
TweenMax.to(el, 1.5, {
y: -10,
opacity: 1,
ease: Sine.easeOut
})
}
return window.scrollY > 100;
}
}
});
D3.js
<div class="box accelerate impact" v-dscroll="totalImpact">
code:d3.js
export default {
methods: {
totalImpact: function(evt, el) {
if (window.scrollY > 1100) {
TweenMax.to(el, 0.75, {
opacity: 0
})
let circ = d3.selectAll("circle")
.attr("cx", function(d) {
let lat = d"Longitude (Deg)";
if (lat.includes("E")) {
return midX - parseInt(lat) * incByW;
} else {
return midX + (parseInt(lat) * incByW);
}
})
...
.attr("r", 5)
.attr("fill", "url(#radgrad)")
}
return window.scrollY > 1300;
},
Nuxt.jsルーティング&ページルーティング
<nuxt-link to="">
JSフックもできる
https://github.com/sdras/nuxt-type
https://nuxt-type.now.sh/
code:js-hooks.js
export default {
transition: {
mode: 'out-in',
css: false,
enter (el, done) {
...
}
...
ネイティブアプリ風のトランジション
https://page-transitions.com/
GitHub.icon https://github.com/sdras/page-transitions-travelapp
code:store/index.js
import Vuex from 'vuex'
const createStore = () => {
return new Vuex.Store({
state: {
page: 'index'
},
mutations: {
updatePage(state, pageName) {
state.page = pageName
}
}
})
}
export default createStore
middlewareを使用する必要あり
code:middleware/page.js
export default function(context) {
// go tell the store to update the page
context.store.commit('updatePage', context.route.name)
}
nuxt.config.jsに登録
code:nuxt.config.js
module.exports = {
...
router: {
middleware: 'pages'
},
...
}
サーバーレス
ミスリーディングな名前だけど面白い(サラ曰く)
FaaS
Google Map APIを使ってみた
https://aka.ms/Qm1j3i
http://cda-locale.azurewebsites.net/
Github.icon https://github.com/sdras/cda-locale/
Azureを使用
Vueを使うと、複雑で美しいインタラクションをとても簡単に作成できる上、ユーザーにとってもシームレスな体験を提供できる。
アプリ内の変化に対して、状態をつなげ、認知させる労力を減らすことが簡単にできる。
Vue Designer: デザインと実装の統合 katashin
https://slides.com/ktsn/vue-fes-vue-designer
https://github.com/ktsn/vue-designer
VS Codeで使う
いずれは他エディタでも対応したい
デザインと実装が分離されているのがつらい
デザイナーがつくったデザインファイルをみて
エンジニアが実装
問題
どのデザインデータがどのソースに当たるのか確認で二度手間になる
運用フェーズで急に要素を実装する時デザインデータに反映し忘れ
レスポンシブ時どうなるかの想定
デザイナー
UX,、IA、アクセシビリティ、スタイルガイド
開発者
コード設計、状態管理、レスポンシブ、アニメーション実装
Dreamweaverデザインビュー
vuegg
プロトタイプでしかできなさそう
Framer X
@ktsnさんの考える(ほしい)デザインツール
SFCファイルで実装かつデザイン
長期開発、運用
動的なデザイン
直近の目標
基礎をつくる
開発者が使って便利
GUI完結ではなくコードと並べる
実装
サーバー
SFC(コンポーネント)
唯一のデータ
開発の任意のフェーズで使える
パーサーで ASTになる
プレビューのレンダリング
意味解析
props/data
あたってるスタイル
importしたコンポーネント
GUIの操作との対応付
コード編集・生成
クライアント
web sokectでサーバーからのASTを受け取る
レンダラーでGUIにする
GUI操作したら再レンダリング
web sokectで解析・コード生成でサーバーにわたす
VS CodeのWebViewが当時なかったからやってた
実装はされたけど、今後もこの体制にしていく
他エディタにも適応したい
デザイナ向けにスタンドアローン版を作る
hostにつないで共同編集
デバックも楽
ブラウザでも確認可能
Chromeだとvue dev tool
SFCの静的解析
ライブラリ
template => vue-eslint-parser
html-parser だとvueのディレクティブやslotや式などが解析できない
script => @babel/paeser
TypeScriptにも対応
style => postcss
未来の構文を使えるようにするため
プリプロセッサ
TypeScriptのみサポート
他言語はOSSなので誰かやってみてほしい
レンダラーの再実装
描画するだけじゃなくて任意の処理を挟むため
dndでのUI構築
ガイド表示
ノードの選択
実装してみてどうだったか
おおよそは実装した
意外とエッジケースが多い
考慮することがあった
Vueのレンダラを使う方法も模索していきたい
1.0.0に向けての展望
開発者が使って便利なものにする
Preview tool of SFC
ブラウザ上で編集したのをコードにもってくるのを1つで完結させたい
Layouting tool
アイデア
npm installするだけでUIフレームワークのデザインで使えるようにする
デザイナーと開発者がGitHubで同じコードを編集
コンポーネントカタログの自動生成
まとめ
デザインと実装が分かれることのつらみ
それを統合したい
SFCが実装、かつ、デザイン
長期開発・運用に使える
動的なデザイン
まずは開発者が便利に使えるように開発
将来的にはデザイナーも使えるようにする
Nuxt.js 2.0 Sébastien Chopin
ORION
Co-founder
https://pro.ekiten.jp
Nuxt.js使ってる
日本での一番のコントリビュートは@inouetakuyaさん
日本の利用は世界で第3位
1位:中国
2位:アメリカ
Nuxt.js
Vue.jsのフレームワーク
インストール
npx create-nuxt-app <project-name>
サーバーサイド
UIフレームワーク
レンダリングモード
Universal Mode
SSR
nuxt
nuxt build
nuxt start
例:https://hn.nuxtjs.org/
Static Generate
nuxt
nuxt generate
SPA
nuxt --spa
nuxt build --spa
axios
ESLint
prettier
パッケージマネージャ
npm
yarn
Nuxt2.0になった
webpack4
babel7
CLIの改善
より速いビルド
起動34%向上
コンパイル速度も45%向上
コードスプリッティングの制御
build.splitChunksの使用
バンドルの分離
クライアント、サーバーで分離
nuxt-start
ランタイム限定
ESモジュール対応
nuxt.config.jsから直接記述できるように
v2.3.0
モダンブラウザー向けビルド
--modern
内部リファクタリング
Q. Vue3.0の追従は大丈夫か?
A. リポジトリにはアクセスできるようになってて追従している。Vue3.0が出る前にはNuxt3.0が出るかも
Q. generateの完全静的化の予定について
A. Nuxt v2.4でstaticモードというのを予定している。asyncDataがjson化される
note のフロントエンドを Nuxt.js で再構築した話 福井 烈
note株式会社
https://speakerdeck.com/fukuiretu/notewonuxt-dot-jsdezai-gou-zhu-sitahua
1. 移行のモチベーション
2014リリース
当時はAngular1.1を選択
要件がそれなりに複雑
2-way binding
サーバーサイドはAPIに専念
エンジニア採用目的
to Cでは珍しい選択だった
課題
初期表示速の遅さ
技術的制約
Angular.js 1系がSSRをサポートしてなかった
Railsにのったフロントエンド
技術的負債
既存の技術の延長で解決できそうにはない
表示速度は正義
日経電子版
Dev.to
経営視点でのフルリニューアル
なかなか難しいように思われたが…
CEOとCXOからGOサインがでる
2018/3に刷新スタート
選定要件
SSR
学習・運用コスト
ガチでなくてもメンテナブルに
情報収集コスト
候補
Express + VanillaJS
React.js
Angular
Vue.js
実行速度と開発効率の両立
学習コストの低さと親しみやすさがある
ドキュメントの充実度
コミュニティの活発度
エキスパートがコンサルになった
@kitakさん
SSRやるときはどうするの?
Nuxt.jsがよい
Nuxtを採用
採用理由
SSRが楽
ディレクトリ構成などの規約がある
モダン環境が手に入る
2. 移行計画
手順
既存UIを確実に移行
ページごとにパス(URL)ベースでLBで振り分ける
苦労ポイント
並行して現行版の改修は続いてる
移行が完全に完了するまでは二重メンテ
進捗
おすすめ一覧ページ
検索ページ
記事詳細(デモアカウント)
コンポーネント数:216
行数:43600~
比較
Lighthouse
パフォーマンス向上(3 => 41)
画像の最適化もするとよい
WebPageTest
Start Render, Speed Indexが1/2
3. 設計・実装のトピック
開発環境
Nuxt 2.2.0
Jest
ESLint
Prettier
CircleCI
Sentry
コンポーネント設計
Angular版
directiveを利用
粒度にルールがない
propsのバケツリレー
仕組みとルールがほしい
Vuex
モジュールモードを採用
肥大化問題
actions, mutation getters ... が各分割できるように
actionsが集中してた
定数を利用
ストアに状態をもたせるかどうか
コンポーネントをこえるものがあるか
Service的な使い方
APIの呼び出し
Atomic Design
components
atoms
内部に他のものを含めない
再利用性、stateless
molecules
内部にAtoms以外含まない
再利用性、Stateless
organisms
Vuexモジュールを参照できる
最初は手探りでやってみた
導入効果
レイヤーの責務がある程度明確に
レイヤーの名称で共有できるように
コンポーネントの視認性問題
Storybook
一度挫折した
Nuxtとの互換性
コンポーネントの修正でストーリーをメンテナンス
Vuexモジュールや通信周りのスタブ化
ver4.0だとNuxt2もつかえる
対象をAtomes,Moleculesに集中する
Unversal JavaScript
問題
SSR時にwindow, documentがundefined
jsdomを使う
code:ssr.js
const JSDOM = jsdom.DOM
const dom = new JSDOM()
global.document = dom.window.document
SSRライフサイクル
ファイルサイズの圧縮
nuxt build --analyze
highlight.js
言語を絞った
moment.js
date-fns
lodash
polyfillでなんとかなる
採用のモチベ
babel-preset-envでやってた
Polyfill.ioを使うとブラウザごとに対応してくれる
インフラ
AWS Lambda
リクエストをトリガーをトリガー
aws-serverless-expree
Node.jsの運用ノウハウ0
pm2が落ちてた
まとめ
パスベースで小さくするのは有効
言語やフレームワークの制約がない
ロールバック・ドッグフーティングが容易
改善完了するまでは2重タスクになる
SSR導入が簡単になった
環境基盤のサポートと規約が非常に強い
Vue CLI 3 and its Graphical User Interface Guillaume Chau
🇯🇵https://slides.com/akryum/vue-cli-18-3-jp#/
🇺🇸https://slides.com/akryum/vue-cli-18-3
既存のVueアプリケーションのやりかた
vue-init
欠点
テンプレートが多い
Scaffolding
Ejectしかできない
アップグレードが困難
新しい仕組みが必要
yarn global add @vue/cli
何が違うか
プラグインベースの新しいアーキテクチャ
VueCLI 3.0 の最終ゴールはスタンダードなビルド用ツールチェインに
vue create
テンプレートは不要になった
プラグインを使用するように
プロジェクトを作り、必要なものを選ぶだけ
プラグインのアップグレードですぐアップグレードできる
@vue/cli-pliguin-...でmonorepo化している
作成
開発
プロダクションビルド(ランタイム)
デプロイ
コミュニティプラグイン
275以上のプラグインが利用可能
Vue CLI UI
vue ui
GUI画面
GraphQL Nodeサーバー
Not Use Electron
CLIなのにGUIってなんでだよ
vue cli 3.0は実は結構複雑
選択肢
コマンド
オプション
アクセシビリティ重視なツールを実現するため
豊富なコンテキスト情報
詳細な説明
検索性の向上
プロンプトUIの向上
ローカライゼーション
not Wifi use it.
今後の話
Vueのアップグレード追従
エラー表示の改善
設定ページ
ショートカットキー
グローバルGUI API